########################################################################
#			Default Targets
########################################################################

.PHONY: all exe static_lib dirs clean 

all : exe  static_lib dirs

exe : $(EXE)

static_lib : $(STATIC_LIB)

dirs : $(DIRS)



########################################################################
#			Compilers
########################################################################

AR = ar

RM = rm -rf

CC = gcc

CPP = g++



########################################################################
#			Compiler Flags
########################################################################

CFLAGS = -Wall -Werror -g -O0 -Wno-deprecated 
#-pg

CPPFLAGS = -Wall -Werror -g -O0 -Wno-deprecated 
#-pg



########################################################################
#			Executable Program Rules
########################################################################

$(EXE) : $(CPP_SRCS:.cpp=.o) $(C_SRCS:.c=.o) 
	$(CPP) $(CPPFLAGS) -o $@ $^ $(LIBS)



########################################################################
#			Static Library Rules
########################################################################

$(STATIC_LIB) : $(CPP_SRCS:.cpp=.o) $(C_SRCS:.c=.o) 
	$(AR) -qcs -o $@ $^



########################################################################
#			Subdirectories
########################################################################

dirs: $(DIRS)

ifdef DIRS
.PHONY: $(DIRS)
$(DIRS):
	@if [ -e $@/Makefile ] ; then $(MAKE) -C $@ $(MAKECMDGOALS) ; fi
endif



########################################################################
#			Implicit Rules
########################################################################

%.o: %.c
	$(CC) $(CFLAGS) $(INCS) $(MACROS) -c $<


%.o: %.cpp
	$(CPP) $(CPPFLAGS) $(INCS) $(MACROS) -c $<


%.d: %.c
	@set -e; rm -f $@; \
		$(CC) -MM $(CFLAGS) $(INCS) $(MACROS) $< > $@.$$$$; \
		sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
		rm -f $@.$$$$


%.d: %.cpp
	@set -e; rm -f $@; \
		$(CPP) -MM $(CPPFLAGS) $(INCS) $(MACROS) $< > $@.$$$$; \
		sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
		rm -f $@.$$$$



########################################################################
#			Cleanup Rules
########################################################################

clean: $(DIRS)
	$(RM) *.o *.d *.d.* $(EXE) $(STATIC_LIB)



########################################################################
#			Dependencies
########################################################################

-include $(CPP_SRCS:.cpp=.d) $(C_SRCS:.c=.d)



